home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 6 / Night Owl's Shareware - PDSI-006 - Night Owl Corp (1990).iso / 040a / loudsp30.zip / LOUDSP30.BAS < prev    next >
BASIC Source File  |  1991-11-28  |  43KB  |  1,459 lines

  1. ' ************************************************
  2. ' ********* LOUDSPEAKER ANALYSIS PROGRAM *********
  3. ' *********           VER 3.00           *********
  4. ' ************************************************
  5.  
  6. ' REV 1.10 WAS RELEASED ON 12/04/86
  7. ' REV 2.06 WAS RELEASED ON 10/04/87
  8. ' REV 2.10 WAS RELEASED ON 11/26/88
  9. ' REV 3.00 WAS RELEASED ON 11/28/91 (last planned release)
  10.  
  11. ' THIS PROGRAM COMPILES UNDER SPECTRA PUBLISHING'S POWER BASIC 2.01
  12. ' WITH SOME CHANGES IT COULD COMPILE UNDER OTHER BASIC COMPILERS.
  13. ' THE SOURCE CODE IS NOW INCLUDED FOR THOSE WHO WISH TO CUSTOMIZE THE  
  14. ' PROGRAM FOR THEIR OWN NEEDS.  THE SOURCE CODE IS BY NO MEANS AN
  15. ' EXAMPLE OF GOOD PROGRAMMING, NOR DOES IT TAKE ADVANTAGE OF MANY OF THE
  16. ' FEATURES OF THE COMPILER.
  17.  
  18. ' ROUTINES COLLECTED FROM VARIOUS SOURCES INCLUDING WEEM'S SPEAKER BOOK,
  19. ' SPEAKER BUILDER MAGAZINE, AND THE LOUDSPEAKER COOKBOOK.
  20.  
  21. '************************** BEGINNING OF LISTING ***************************
  22.  
  23. $COMPILE EXE                 'COMPILER METASTRINGS (OPTIONAL)
  24. $CPU 8086
  25. $DEBUG MAP OFF
  26. $ERROR ALL OFF
  27. $FLOAT EMULATE               'EMULATE COPROCESSOR FOR MOST OF PROGRAM
  28. $LIB COM OFF, GRAPH ON
  29. $OPTION CNTLBREAK OFF
  30. $INCLUDE "REGNAMES.INC"      'NECESSARY FOR BIOS CALLS USED IN VIDEO DETECTION
  31.  
  32. ON ERROR GOTO DAMAGECONTROL
  33. DEFDBL A-Z
  34. DIM M(200)                   'HOLDS THE GRAPH DATA POINTS
  35. DIM BUFFER%(64)              'BUFFER FOR INITIAL VIDEO DATA DUMP
  36. VERSION$="VERSION 3.00"
  37. PI=ATN(1) * 4                'CALCULATE PI
  38. RESOL%=2                     'DEFAULT GRAPH AND CALC RESOLUTION (1 TO 20 HZ)
  39. RESCA=0.05                   'RESCALE VALUE FOR LOG GRAPHS
  40. AUTOFLAG%=0                  'KEEP TRACK OF VIDEO INITIALIZATION METHOD
  41. RANDOMIZE TIMER              'SEED THE RANDOM NUMBER GENERATOR
  42.  
  43. CALL SETUPDATAIN             'READ SETUP FILE ON DISK
  44. CALL SETUPCHECK              'CHECK FOR CONTRASTING COLORS
  45.  
  46. IF VIDEOTYPE$="AUTO" THEN CALL LOOKFOVID:AUTOFLAG%=1
  47.  
  48. IF VIDEOTYPE$="HERC" THEN
  49.   SCREEN 3
  50.   CALL FIRSTSCREEN1
  51.   CALL WAITFOKEY
  52. END IF
  53.  
  54. IF VIDEOTYPE$="CGA" THEN
  55.   SCREEN 2
  56.   CALL FIRSTSCREEN1
  57.   CALL WAITFOKEY
  58. END IF
  59.  
  60. IF VIDEOTYPE$="EGA" THEN
  61.   SCREEN 8
  62.   COLOR KOLORA%, KOLORB%
  63.   CALL FIRSTSCREEN1
  64.   CALL FIRSTSCREEN2
  65.   CALL ROTATE
  66. END IF
  67.  
  68. IF VIDEOTYPE$="VGA" THEN
  69.   SCREEN 9
  70.   COLOR KOLORA%, KOLORB%
  71.   CALL FIRSTSCREEN1
  72.   CALL FIRSTSCREEN2
  73.   CALL ROTATE
  74. END IF
  75.  
  76. DO                         'FIRST MENU SCREEN & MAIN PROGRAM LOOP
  77.   SCREEN 0
  78.   IF RIGHT$(VIDEOTYPE$,2)="GA" THEN COLOR KOLORA%,KOLORB%
  79.   CLS
  80.   LOCATE 3,26:PRINT"LOUDSPEAKER ANALYSIS PROGRAM"
  81.   LOCATE 4,35:PRINT"MENU #1"
  82.   LOCATE 8,23:PRINT"1. LOAD driver data from disk"
  83.   LOCATE 9,23:PRINT"2. automatic PORTED enclosure design"
  84.   LOCATE 10,23:PRINT"3. manual PORTED enclosure design"
  85.   LOCATE 11,23:PRINT"4. SEALED enclosure design"
  86.   LOCATE 12,23:PRINT"5. calculate maximum POWER levels"
  87.   LOCATE 13,23:PRINT"6. UTILITIES menu"
  88.   LOCATE 14,23:PRINT"7. SAVE driver data to disk"
  89.   LOCATE 15,23:PRINT"8. EXIT to DOS"
  90.   LOCATE 22,28:PRINT"ENTER SELECTION (1-8)"
  91.  
  92.   CALL WAITFOKEY
  93.  
  94.   SELECT CASE VAL(K$)
  95.     CASE 1
  96.       CALL DRIVERDATIN
  97.     CASE 2
  98.       GOSUB OPTPORTED
  99.     CASE 3
  100.       GOSUB MODPORTED
  101.     CASE 4
  102.       GOSUB SEALED
  103.     CASE 5
  104.       CALL MAXPOWER
  105.     CASE 6
  106.       CALL MENUTWO
  107.     CASE 7
  108.       CALL DRIVERDATOUT
  109.     CASE 8
  110.       GOSUB BYEBYE
  111.   END SELECT
  112. LOOP
  113.  
  114. '-----------------------------END OF MAIN PROGRAM LOOP----------------------
  115.  
  116.  
  117. SUB MENUTWO                  'SECOND MENU SCREEN
  118.   SHARED K$
  119.   DO
  120.     CLS
  121.     LOCATE 3,26:PRINT"LOUDSPEAKER ANALYSIS PROGRAM"
  122.     LOCATE 4,35:PRINT"MENU #2"
  123.     LOCATE 22,28:PRINT"ENTER SELECTION (1-9)"
  124.     LOCATE 8,23:PRINT"1. calculate PORT dimensions"
  125.     LOCATE 9,23:PRINT"2. calculate ENCLOSURE dimensions"
  126.     LOCATE 10,23:PRINT"3. CONVERT liters or cubic feet"
  127.     LOCATE 11,23:PRINT"4. CROSSOVER design aid"
  128.     LOCATE 12,23:PRINT"5. SETUP display, colors, and path"
  129.     LOCATE 13,23:PRINT"6. calculate DRIVER parameters (advanced users)"
  130.     LOCATE 14,23:PRINT"7. shell to DOS (return with 'exit' command)"
  131.     LOCATE 15,23:PRINT"8. n/a"
  132.     LOCATE 16,23:PRINT"9. RETURN to main menu"
  133.     LOCATE 22,28:PRINT"ENTER SELECTION (1-9)"
  134.  
  135.     CALL WAITFOKEY
  136.  
  137.     SELECT CASE VAL(K$)
  138.       CASE 1
  139.         CALL VENTLENGTH
  140.       CASE 2
  141.         CALL BOXSIZE
  142.       CASE 3
  143.         CALL VOLCONVERT
  144.       CASE 4
  145.         CALL CROSSOVER
  146.       CASE 5
  147.         CALL SETUPDATAOUT
  148.       CASE 6
  149.         CALL PARAMCALC
  150.       CASE 7
  151.         CALL DOSSHELL
  152.       CASE 8
  153.         CALL FOOLISHNESS
  154.     END SELECT
  155.     IF VAL(K$)=9 THEN EXIT LOOP
  156.   LOOP
  157. END SUB
  158.  
  159. SUB PARAMCALC SHARED         'CALCULATE DRIVER PARAMETERS FROM MEASUREMENTS
  160.   CLS
  161.   LOCATE 3,26:PRINT"DRIVER PARAMETER CALCULATOR"
  162.   PRINT:PRINT:PRINT
  163.   OD$=D$
  164.   PRINT" Enter driver name (default is ";OD$;")";
  165.   LOCATE ,60
  166.   INPUT D$:IF D$="" THEN D$=OD$
  167.   PRINT
  168.  
  169.   QUERY$="Enter voice coil resistance in ohms"
  170.   MINALLOWVAL! = 0.001
  171.   MAXALLOWVAL! = 10000
  172.   OLDVAL! = RE
  173.   GOSUB STANDARDDATAIN
  174.   RE = NEWVAL!
  175.  
  176.   QUERY$="Enter free air resonance in Hertz"
  177.   MINALLOWVAL! = 1
  178.   MAXALLOWVAL! = 999
  179.   OLDVAL! = FS
  180.   GOSUB STANDARDDATAIN
  181.   FS = NEWVAL!
  182.  
  183.   QUERY$="Enter Z in ohms at"+STR$(FS)+" Hertz"
  184.   MINALLOWVAL! = .01
  185.   MAXALLOWVAL! = 999
  186.   OLDVAL! = ZMAX
  187.   GOSUB STANDARDDATAIN
  188.   ZMAX = NEWVAL!
  189.  
  190.   RO=ZMAX/RE
  191.   RF=SQR(RO)*RE
  192.  
  193.   PRINT" Enter the frequency BELOW free air resonance where:"
  194.   QUERY$="Z="+STR$(RF,4)+" ohms"
  195.   MINALLOWVAL! = 1
  196.   MAXALLOWVAL! = 999
  197.   OLDVAL! = F1
  198.   GOSUB STANDARDDATAIN
  199.   F1 = NEWVAL!
  200.  
  201.   PRINT" Enter the frequency ABOVE free air resonance where:"
  202.   QUERY$="Z="+STR$(RF,4)+" ohms"
  203.   MINALLOWVAL! = 1
  204.   MAXALLOWVAL! = 999
  205.   OLDVAL! = F2
  206.   GOSUB STANDARDDATAIN
  207.   F2 = NEWVAL!
  208.  
  209.   QMS=FS*SQR(RO)/(F2-F1)
  210.   QES=QMS/(RO-1)
  211.   QTS=QMS*QES/(QMS+QES)
  212.  
  213.   QUERY$="Enter test box volume in cubic feet"
  214.   MINALLOWVAL! = .01
  215.   MAXALLOWVAL! = 999
  216.   OLDVAL! = TVB
  217.   GOSUB STANDARDDATAIN
  218.   TVB = NEWVAL!
  219.  
  220.   QUERY$="Enter resonance of driver in box"
  221.   MINALLOWVAL! = FS
  222.   MAXALLOWVAL! = 999
  223.   OLDVAL! = TFS
  224.   GOSUB STANDARDDATAIN
  225.   TFS = NEWVAL!
  226.  
  227.   VAS=TVB*(1.149*((TFS/FS)^2-1))
  228.  
  229.   CLS
  230.   LOCATE 3,26:PRINT"CALCULATED DRIVER PARAMETERS"
  231.   LOCATE 6,2
  232.   PRINT D$
  233.   PRINT:PRINT
  234.   PRINT USING " Voice coil resistance = ##.## ohms";RE
  235.   PRINT USING " Free air resonance    = ##.## hertz";FS
  236.   PRINT USING " Qms (mechanical)      = #.####";QMS
  237.   PRINT USING " Qes (electrical)      = #.####";QES
  238.   PRINT USING " Qts (total)           = #.####";QTS
  239.   PRINT USING " Vas (compliance)      = ##.## cubic feet";VAS
  240.  
  241.   PRINT:PRINT:PRINT" Do you want this data sent to the printer? (Y/N)"
  242.   CALL WAITFOKEY
  243.  
  244.   IF K$="Y" OR K$="y" THEN
  245.     LPRINT "Calculated driver parameters for ";D$
  246.     LPRINT
  247.     LPRINT USING "Resistance (DC)      Re= ##.# Ohms";RE
  248.     LPRINT USING "Free air resonance   Fs= ##.# Hertz";FS
  249.     LPRINT USING "Q (mechanical)      Qms= #.####";QMS
  250.     LPRINT USING "Q (electrical)      Qes= #.####";QES
  251.     LPRINT USING "Q (total driver)    Qts= #.####";QTS
  252.     LPRINT USING "compliance          Vas= ##.## cubic feet";VAS
  253.     LPRINT:LPRINT:LPRINT
  254.   END IF
  255. END SUB
  256.  
  257. OPTPORTED:
  258.   CLS
  259.   LOCATE 3,25:PRINT"OPTIMUM PORTED ENCLOSURE DESIGN"
  260.   DESIGN$="optimal ported"
  261.   PRINT:PRINT:PRINT
  262.   OD$=D$
  263.   PRINT " Enter driver name (default is ";LEFT$(D$,23);")";
  264.   LOCATE ,60
  265.   INPUT D$:IF D$="" THEN D$=OD$
  266.   PRINT
  267.  
  268.   QUERY$="Enter Qts value"
  269.   MINALLOWVAL! = .01
  270.   MAXALLOWVAL! = 999
  271.   OLDVAL! = QTS
  272.   GOSUB STANDARDDATAIN
  273.   QTS = NEWVAL!                          'GET QTS VALUE
  274.  
  275.   QUERY$="Enter Vas value"
  276.   MINALLOWVAL! = .01
  277.   MAXALLOWVAL! = 999
  278.   OLDVAL! = VAS
  279.   GOSUB STANDARDDATAIN
  280.   VAS = NEWVAL!                          'GET VAS VALUE
  281.  
  282.   QUERY$="Enter free air resonance"
  283.   MINALLOWVAL! = 1
  284.   MAXALLOWVAL! = 999
  285.   OLDVAL! = FS
  286.   GOSUB STANDARDDATAIN
  287.   FS = NEWVAL!                           'GET FS VALUE
  288.  
  289.   VB=20*QTS^3.3*VAS
  290.   FH=.28*(QTS^-1.4)*FS
  291.   FB=1.5*(QTS^.44)*FH
  292.  
  293. DISPOPTALIGN:
  294.   CLS
  295.   LOCATE 3,31:PRINT"OPTIMUM ALIGNMENT":PRINT:PRINT
  296.   PRINT USING " Qts                   =  ##.###";QTS
  297.   PRINT USING " Vas                   =  ##.### cubic feet";VAS
  298.   PRINT USING " Free air resonance    =  ##.### hertz";FS
  299.   PRINT
  300.   PRINT USING " Enclosure volume      =  ##.### cubic feet";VB
  301.   PRINT USING " Enclosure tuning      =  ##.### hertz";FB
  302.   PRINT USING " System is down 3 dB   @ ###.### hertz";FH
  303.   PRINT
  304.   PRINT USING " Deviation from flat response   = +##.## dB";HUMP!(QTS, VAS, VB)
  305.  
  306.   PRINT:PRINT:PRINT" Do you wish to resize the enclosure? (Y/N)"
  307.   CALL WAITFOKEY
  308.  
  309.   IF K$="Y" OR K$="y" THEN
  310.     QUERY$="Enter new enclosure volume"
  311.     MINALLOWVAL! = .001
  312.     MAXALLOWVAL! = 1E6
  313.     OLDVAL! = VB
  314.     GOSUB STANDARDDATAIN
  315.     VB = NEWVAL!                         'GET VB VALUE
  316.     FH = FS*(VAS/VB)^.44
  317.     FB = FH/(VAS/VB)^.13
  318.     GOTO DISPOPTALIGN:
  319.   END IF
  320.  
  321.   PRINT" Do you want a printout of this design? (Y/N)"
  322.   CALL WAITFOKEY
  323.  
  324.   IF K$="Y" OR K$="y" THEN CALL UNIVPRINT
  325.  
  326.   PRINT" Do you want to display the response curve? (Y/N)"
  327.   CALL WAITFOKEY
  328.  
  329.   IF K$="Y" OR K$="y" THEN
  330.     GOSUB CALCARRAY
  331.     GOSUB PRINTGRAPH
  332.   END IF
  333.  
  334. RETURN
  335.  
  336. MODPORTED:
  337.   CLS
  338.   LOCATE 3,24:PRINT"MODIFIED PORTED ENCLOSURE SYSTEM"
  339.   DESIGN$="non-optimal, ported"
  340.   PRINT:PRINT:PRINT
  341.   OD$=D$
  342.   PRINT" Enter driver name (default is ";LEFT$(D$,23);")";
  343.   LOCATE ,60
  344.   INPUT D$:IF D$="" THEN D$=OD$        'GET DRIVER NAME
  345.   PRINT
  346.  
  347.   QUERY$="Enter Qts value"
  348.   MINALLOWVAL! = .01
  349.   MAXALLOWVAL! = 999
  350.   OLDVAL! = QTS
  351.   GOSUB STANDARDDATAIN
  352.   QTS = NEWVAL!                          'GET QTS VALUE
  353.  
  354.   QUERY$="Enter Vas value"
  355.   MINALLOWVAL! = .01
  356.   MAXALLOWVAL! = 999
  357.   OLDVAL! = VAS
  358.   GOSUB STANDARDDATAIN
  359.   VAS = NEWVAL!                          'GET VAS VALUE
  360.  
  361.   QUERY$="Enter free air resonance"
  362.   MINALLOWVAL! = 1
  363.   MAXALLOWVAL! = 999
  364.   OLDVAL! = FS
  365.   GOSUB STANDARDDATAIN
  366.   FS = NEWVAL!                           'GET FS VALUE
  367.  
  368.   QUERY$="Enter enclosure volume in cubic feet"
  369.   MINALLOWVAL! = .01
  370.   MAXALLOWVAL! = 1E6
  371.   OLDVAL! = VB
  372.   GOSUB STANDARDDATAIN
  373.   VB = NEWVAL!                           'GET VB VALUE
  374.  
  375.   QUERY$="Enter enclosure tuning"
  376.   MINALLOWVAL! = 1
  377.   MAXALLOWVAL! = 999
  378.   OLDVAL! = FB
  379.   GOSUB STANDARDDATAIN
  380.   FB = NEWVAL!                           'GET FB VALUE
  381.  
  382.   GOSUB CALCARRAY
  383.   GOSUB PRINTGRAPH
  384.  
  385.   CLS
  386.   LOCATE 10,20:PRINT"Press R to repeat the design routine,"
  387.   LOCATE 12,20:PRINT"      P to print the data, or"
  388.   LOCATE 14,20:PRINT"      any other key to return to the main menu."
  389.  
  390.   CALL WAITFOKEY
  391.  
  392.   IF K$="R" OR K$="r" THEN MODPORTED
  393.   IF K$="P" OR K$="p" THEN CALL UNIVPRINT
  394. RETURN
  395.  
  396. SEALED:                      'SEALED DESIGN ROUTINE
  397.  
  398.   CLS:LOCATE 3,28:PRINT"SEALED ENCLOSURE DESIGN"
  399.   DESIGN$="sealed"
  400.   PRINT:PRINT:PRINT
  401.   OD$=D$
  402.   PRINT" Enter driver name (default is ";LEFT$(D$,23);")";
  403.   LOCATE ,60
  404.   INPUT D$:IF D$="" THEN D$=OD$        'GET DRIVER NAME
  405.   PRINT
  406.  
  407.   QUERY$="Enter Qts value"
  408.   MINALLOWVAL! = .01
  409.   MAXALLOWVAL! = 999
  410.   OLDVAL! = QTS
  411.   GOSUB STANDARDDATAIN
  412.   QTS = NEWVAL!                        'GET Qts VALUE
  413.  
  414.   QUERY$="Enter Vas value"
  415.   MINALLOWVAL! = .01
  416.   MAXALLOWVAL! = 999
  417.   OLDVAL! = VAS
  418.   GOSUB STANDARDDATAIN
  419.   VAS = NEWVAL!                        'GET Vas VALUE
  420.  
  421.   QUERY$="Enter free air resonance"
  422.   MINALLOWVAL! = 1
  423.   MAXALLOWVAL! = 999
  424.   OLDVAL! = FS
  425.   GOSUB STANDARDDATAIN
  426.   FS = NEWVAL!                         'GET Fs VALUE
  427.  
  428.   QUERY$="Enter target Qtc value from Qts to 5.0"
  429.   MINALLOWVAL! = QTS+0.01              'PREVENT DIVIDE BY ZERO ERRORS
  430.   MAXALLOWVAL! = 5.0
  431.   OLDVAL! = 0.9
  432.   GOSUB STANDARDDATAIN
  433.   TC=NEWVAL!                           'GET Qtc VALUE
  434.  
  435.   VB=VAS/((((TC/FS)/QTS*FS)^2)-1)      'FORMULA CONVERTED TO USE QTS INPUT
  436.   A=VAS/VB
  437.   FC=FS*SQR(A+1)
  438.   F3=FC*SQR(((1/TC^2-2)+SQR((1/TC^2-2)^2+4))/2)
  439.  
  440. DISPSEALED:
  441.   CLS:LOCATE 3,28:PRINT"SEALED ENCLOSURE DESIGN"
  442.   PRINT:PRINT:PRINT
  443.   PRINT USING " Qts                   =  ##.###";QTS
  444.   PRINT USING " Vas                   =  ##.### cubic feet";VAS
  445.   PRINT USING " Free air resonance    =  ##.### hertz";FS
  446.   PRINT
  447.   PRINT USING " Enclosure volume      =  ##.### cubic feet";VB
  448.   PRINT USING " System is down 3 dB   @ ###.### hertz";F3
  449.   PRINT USING " System Q (Qtc)        =  ##.###";TC;
  450.   PRINT " (typically between 0.577 AND 1.2)"
  451.   PRINT USING " Alpha                 =  ##.###";A;
  452.   PRINT " (typically between 3.0 and 10)"
  453.   PRINT USING " Resonant frequency    = ###.### hertz";RFC!(TC, FS, QTS)
  454.  
  455.   PRINT:PRINT:PRINT
  456.  
  457.   PRINT" Do you wish to resize the enclosure? (Y/N)"
  458.   CALL WAITFOKEY
  459.  
  460.   IF K$="Y" OR K$="y" THEN
  461.     QUERY$="Enter the new enclosure volume"
  462.     MINALLOWVAL!=.01
  463.     MAXALLOWVAL!=1E6
  464.     OLDVAL!=VB
  465.     GOSUB STANDARDDATAIN
  466.     VB=NEWVAL!
  467.  
  468.     A=VAS/VB
  469.     FC=FS*SQR(A+1)
  470.     TC=(FC*QTS)/FS
  471.     F3=FC*SQR(((1/TC^2-2)+SQR((1/TC^2-2)^2+4))/2)
  472.     GOTO DISPSEALED
  473.   END IF
  474.  
  475.   PRINT" Do you want a printout of this data? (Y/N)"
  476.   CALL WAITFOKEY
  477.  
  478.   IF K$="Y" OR K$="y" THEN CALL UNIVPRINT
  479.  
  480.   PRINT" Do you wish to display the response curve? (Y/N)"
  481.   CALL WAITFOKEY
  482.  
  483.   IF K$="Y" OR K$="y" THEN
  484.     GOSUB CALCARRAY2
  485.     GOSUB PRINTGRAPH
  486.     GOTO DISPSEALED
  487.   END IF
  488.  
  489. RETURN
  490.  
  491. FUNCTION HUMP!(QTS, VAS, VB)           'AMPLITUDE OF HUMP FOR PORTED BOX
  492.   HUMP!=20*LOG(QTS*(VAS/VB)^.3/.4)/LOG(10)
  493. END FUNCTION
  494.  
  495. FUNCTION RFC!(TC, FS, QTS)             'RESONANT FREQ OF SEALED BOX SYSTEM
  496.   RFC!=(TC*FS)/QTS
  497. END FUNCTION
  498.  
  499. CALCARRAY2:
  500.   PRINT:PRINT:PRINT" calculating . . ."
  501.   FOR F%=20 TO 200 STEP RESOL%
  502.   FH=F%/FC:FQ=FH^2:MAG=FQ/(SQR((FQ-1)^2+(FH/TC)^2))
  503.   M(F%)=20*(LOG(MAG)/LOG(10))
  504.   IF M(F%)<-40 THEN M(F%)=-40          'STAY WITHIN THE TOP OF THE GRAPH
  505.   IF M(F%)>10 THEN M(F%)=10            'STAY WITHIN THE BOTTOM OF IT TOO
  506.   NEXT F%
  507. RETURN
  508.  
  509. STANDARDDATAIN:              'BRING IN ALL FLOATING POINT NUMERIC DATA
  510.  
  511.   'INPUT PARAMETERS:  MINALLOWVAL!  -  MINIMUM ACCEPTABLE VALUE
  512.   '                   MAXALLOWVAL!  -  MAXIMUM ACCEPTABLE VALUE
  513.   '                   OLDVAL!       -  THE ORIGINAL VALUE AS A DEFAULT
  514.   '                   QUERY$        -  THE PROMPTING STATEMENT
  515.  
  516.   'OUTPUT PARAMETERS: NEWVAL!       -  THE NEW VALUE
  517.  
  518.   PRINT " ";QUERY$;" (default is";    'PRINT THE QUESTION AND DEFAULT VALUE
  519.   PRINT ROUND(OLDVAL!,2);
  520.   LOCATE ,POS-1
  521.   PRINT")";
  522.  
  523.   OLDY%=CSRLIN                         'REMEMBER WHAT LINE WE ARE ON
  524.  
  525.   DO
  526.     LOCATE OLDY%, 60
  527.     PRINT "           "                'CLEAR THE OLD VALUE (IF ANY)
  528.     LOCATE OLDY%, 60
  529.     INPUT NEWVAL!
  530.     LIMITFLAG% = 1
  531.     IF (NEWVAL! = 0) AND (OLDVAL! <> 0) THEN NEWVAL! = OLDVAL! : EXIT LOOP
  532.     IF NEWVAL! > MAXALLOWVAL! THEN LIMITFLAG% = 0
  533.     IF NEWVAL! < MINALLOWVAL! THEN LIMITFLAG% = 0
  534.   LOOP UNTIL LIMITFLAG% = 1
  535.   PRINT
  536. RETURN
  537.  
  538. STANDARDINTIN:              'BRING IN ALL STANDARD INTEGER DATA FROM USER
  539.                             'NOTE THAT THIS ROUTINE SUPPLIES NO CURSOR!
  540.   PRINT " ";QUERY$;" (default is";    'PRINT THE QUESTION AND DEFAULT VALUE
  541.   PRINT OLDVAL%;
  542.   LOCATE ,POS-1
  543.   PRINT ")";
  544.   OLDY%=CSRLIN                         'REMEMBER WHAT LINE WE ARE ON
  545.  
  546.   DO
  547.     LOCATE OLDY%, 60
  548.     PRINT "?_          "                'CLEAR THE OLD VALUE (IF ANY)
  549.     LOCATE OLDY%, 61
  550.  
  551.     NEWVAL$=""
  552.     K$=""
  553.     K%=0
  554.  
  555.     DO
  556.  
  557.       K$=INKEY$                        'GET A SINGLE CHARACTOR
  558.  
  559.       IF (ASCII(K$)>47) AND (ASCII(K$)<58) THEN  'SEE IF ITS A NUMBER 0-9
  560.         PRINT K$;                                'PRINT IT
  561.         NEWVAL$=NEWVAL$+K$                       'ADD IT TO THE STRING
  562.         K%=K%+1                                  'COUNT HOW MANY DIGITS
  563.       END IF
  564.  
  565.       IF (ASCII(K$) = 8) AND (K%>0) THEN         'SEE IF ITS A BACKSPACE
  566.         LOCATE ,POS-1                            '  AND DONT GO BELOW ZERO
  567.         PRINT " ";                               'PRINT A BLANK
  568.         LOCATE ,POS-1                            'BACKUP AGAIN
  569.         NEWVAL$=LEFT$(NEWVAL$,LEN(NEWVAL$)-1)    'REMOVE IT FROM THE STRING
  570.         K%=K%-1                                  'SUBTRACT IT FROM THE COUNT
  571.       END IF
  572.  
  573.     LOOP UNTIL K$=CHR$(13)                       'LOOK FOR CARRIAGE RETURN
  574.  
  575.     NEWVAL%=INT(VAL(NEWVAL$))                    'PLUCK OUT THE NUMBER
  576.  
  577.     LIMITFLAG% = 1
  578.     IF NEWVAL$ = "" THEN NEWVAL% = OLDVAL% : EXIT LOOP
  579.     IF NEWVAL% > MAXALLOWVAL% THEN LIMITFLAG% = 0
  580.     IF NEWVAL% < MINALLOWVAL% THEN LIMITFLAG% = 0
  581.   LOOP UNTIL LIMITFLAG% = 1
  582.   PRINT
  583. RETURN
  584.  
  585. CALCARRAY:
  586.   PRINT:PRINT:PRINT" calculating . . . ."
  587.   A=(FB^2)/(FS^2)
  588.   B=A/QTS+(FB/(7*FS))
  589.   C=1+A+(FB/(7*FS*QTS))+(VAS/VB)
  590.   D=1/QTS+(FB/(7*FS))
  591.   FOR F%=20 TO 200 STEP RESOL%
  592.   F9=F%/FS:F5=F9^2
  593.   F4=F9^4:F3=F9^3
  594.   F6=(F4-C*F5+A)^2
  595.   F7=(B*F9-D*F3)^2
  596.   M(F%)=20*(LOG(F4/(F6+F7)^.5)/LOG(10))
  597.   IF M(F%)<-40 THEN M(F%)=-40       'STAY WITHIN THE TOP OF THE GRAPH
  598.   IF M(F%)>10 THEN M(F%)=10         'STAY WITHIN THE BOTTOM OF IT TOO
  599.   NEXT
  600. RETURN
  601.  
  602. PRINTGRAPH:
  603.   $FLOAT PROCEDURE
  604.   IF VIDEOTYPE$="HERC" THEN SCREEN 3:WINDOW SCREEN (0,635)-(995,10)
  605.   IF VIDEOTYPE$="CGA" THEN SCREEN 2:WINDOW SCREEN (0,640)-(1000,10)
  606.   IF VIDEOTYPE$="EGA" THEN SCREEN 9:COLOR GRAPHKOLORA%,GRAPHKOLORB%:WINDOW SCREEN (0,640)-(1000,10)
  607.   IF VIDEOTYPE$="VGA" THEN SCREEN 12:COLOR GRAPHKOLORA%,GRAPHKOLORB%:WINDOW SCREEN (0,770)-(1000,12)
  608.  
  609.   CLS
  610.   LINE (150,50)-(850,550),,B
  611.  
  612.   FOR VER%=1 TO 9
  613.     VERT%=LOG(VER%)/LOG(10)*700+150
  614.     LINE (VERT%,50)-(VERT%,550),,,&HAAAA
  615.   NEXT VER%
  616.  
  617.   FOR HOR%=150 TO 550 STEP 100
  618.     LINE (150,HOR%)-(850,HOR%),,,&HCCCC
  619.   NEXT HOR%
  620.  
  621.   LOCATE 23,11:PRINT" 20               40        60     80   100";
  622.   PRINT"     140      200"
  623.  ' LOCATE 24,33:PRINT"FREQUENCY (HERTZ)"
  624.   LOCATE 2,72:PRINT"+10"
  625.   LOCATE 6,72:PRINT" 0   dB"
  626.   LOCATE 10,72:PRINT"-10"
  627.   LOCATE 14,72:PRINT"-20"
  628.   LOCATE 18,72:PRINT"-30"
  629.   LOCATE 22,72:PRINT"-40"
  630.  
  631.  'DRAW PLOT
  632.   IF VIDEOTYPE$="EGA" OR VIDEOTYPE$="VGA" THEN COLOR GRAPHKOLORC%
  633.  
  634.   FOR F%=20 TO 200-RESOL% STEP RESOL%
  635.     FLOG%=LOG(((F%-20)*RESCA)+1)/LOG(10)*700+150
  636.     FLOG1%=LOG(((F%-(20-RESOL%))*RESCA)+1)/LOG(10)*700+150
  637.     LINE (FLOG%,M(F%)*-10+150)-(FLOG1%,M(F%+RESOL%)*-10+150)
  638.   NEXT F%
  639.  
  640.   IF VIDEOTYPE$="VGA" THEN
  641.     COLOR GRAPHKOLORA%,GRAPHKOLORB%
  642.     LOCATE 26,12:PRINT D$
  643.     LOCATE 26,56:PRINT USING "VB=##.## cubic feet";VB
  644.  
  645.     IF DESIGN$="sealed" THEN
  646.       LOCATE 27,56:PRINT USING "F3=###.# hertz";F3
  647.     END IF
  648.  
  649.     IF DESIGN$="optimal ported" THEN
  650.       LOCATE 27,56:PRINT USING "FB=###.# hertz";FB
  651.       LOCATE 28,56:PRINT USING "F3=###.# hertz";FH;
  652.     END IF
  653.  
  654.     IF DESIGN$="non-optimal, ported" THEN
  655.       LOCATE 27,56:PRINT USING "FB=###.# hertz";FB
  656.     END IF
  657.  
  658.   ELSE
  659.     IF VIDEOTYPE$="EGA" THEN COLOR GRAPHKOLORA%, GRAPHKOLORB%
  660.  
  661.     LOCATE 2,1:PRINT "VOLUME"
  662.     LOCATE 3,1:PRINT ROUND(VB,2);"ft^3"
  663.  
  664.     IF DESIGN$="sealed" THEN
  665.       LOCATE 5,1:PRINT "F3:"
  666.       LOCATE 6,1:PRINT ROUND(F3,2);"hz"
  667.     END IF
  668.  
  669.     IF DESIGN$="optimal ported" THEN
  670.       LOCATE 5,1:PRINT "F3:"
  671.       LOCATE 6,1:PRINT ROUND(FH,2);"hz"
  672.       LOCATE 8,1:PRINT "TUNING:"
  673.       LOCATE 9,1:PRINT ROUND(FB,2);"hz"
  674.     END IF
  675.  
  676.     IF DESIGN$="non-optimal, ported" THEN
  677.       LOCATE 5,1:PRINT "TUNING:"
  678.       LOCATE 6,1:PRINT ROUND(FB,2);"hz"
  679.     END IF
  680.  
  681.     LOCATE 24,12:PRINT D$;
  682.  
  683.   END IF
  684.  
  685.   CALL WAITFOKEY
  686.  
  687.   SCREEN 0
  688.   IF VIDEOTYPE$<>"HERC" THEN COLOR KOLORA%,KOLORB%
  689.   $FLOAT EMULATE
  690. RETURN
  691.  
  692. BYEBYE:            ' LETS GET OUTA HERE ROUTINE!
  693.   CLS
  694.   LOCATE 10,14:PRINT"You are about to EXIT this program and return to DOS..."
  695.   LOCATE 12,25:PRINT"Hit C to go back to the program"
  696.   LOCATE 14,18:PRINT"Any other key will complete the exit to DOS."
  697.  
  698.   CALL WAITFOKEY
  699.  
  700.   IF K$="C" OR K$="c" THEN RETURN
  701.  
  702.   SCREEN 0
  703.   KEY ON
  704.   CLS
  705.   END
  706.  
  707. SUB WAITFOKEY                'HIT-ANY-KEY LOOP
  708.   SHARED K$
  709.   K$=""
  710.   WHILE NOT INSTAT : WEND
  711.   K$=INKEY$
  712. END SUB
  713.  
  714. SUB DRIVERDATIN              'LOAD DRIVER DATA FROM DISK
  715.   SHARED D$, FS, QTS, VAS, DPATH$, FILENAME$, WAY$
  716.   WAY$="LOAD"
  717.  
  718.   DO
  719.     REPEATFLAG%=0
  720.     CALL GENDIRECTORY
  721.     IF FILENAME$="" THEN EXIT SUB
  722.     IF MID$(FILENAME$,2,1)=":" OR LEFT$(FILENAME$,1)="\" THEN
  723.       IF RIGHT$(FILENAME$,1)="\" OR RIGHT$(FILENAME$,1)=":" THEN
  724.         DPATH$=FILENAME$
  725.         REPEATFLAG%=1
  726.       END IF
  727.     END IF
  728.   LOOP WHILE REPEATFLAG%=1
  729.  
  730.   FILENAME$=DPATH$+FILENAME$+".DRI"
  731.   OPEN FILENAME$ FOR INPUT AS #1
  732.   INPUT #1, D$,FS,QTS,VAS
  733.   CLOSE
  734. END SUB
  735.  
  736. SUB DRIVERDATOUT             'SAVE DRIVER DATA TO DISK
  737.   SHARED D$, FS, QTS, VAS, DPATH$, FILENAME$, WAY$
  738.   WAY$="SAVE"
  739.  
  740.   DO
  741.     REPEATFLAG%=0
  742.     CALL GENDIRECTORY
  743.     IF FILENAME$="" THEN EXIT SUB
  744.     IF MID$(FILENAME$,2,1)=":" OR LEFT$(FILENAME$,1)="\" THEN
  745.       IF RIGHT$(FILENAME$,1)="\" OR RIGHT$(FILENAME$,1)=":" THEN
  746.         DPATH$=FILENAME$
  747.         REPEATFLAG%=1
  748.       END IF
  749.     END IF
  750.   LOOP WHILE REPEATFLAG%=1
  751.  
  752.   FILENAME$=DPATH$+FILENAME$+".DRI"
  753.   PRINT:PRINT"Saving driver data to disk . . ."
  754.  
  755.   OPEN FILENAME$ FOR OUTPUT AS #1
  756.     PRINT#1,D$
  757.     PRINT#1,FS
  758.     PRINT#1,QTS
  759.     PRINT#1,VAS
  760.   CLOSE
  761. END SUB
  762.  
  763. SUB GENDIRECTORY             'GET THE DISK DIRECTORY AND/OR FILENAME
  764.   SHARED DPATH$, FILENAME$, WAY$
  765.   CLS
  766.   PRINT:PRINT"These are the driver files available on:"
  767.   PRINT DPATH$+"*.DRI"
  768.   PRINT
  769.   FILES DPATH$+"*.DRI"
  770.   PRINT:PRINT:PRINT:PRINT"Enter filename you wish to ";WAY$;" (no ext.)"
  771.   INPUT FILENAME$
  772. END SUB
  773.  
  774. SUB BOXSIZE                  'GOLDEN RECTANGLE BOX DIMENSIONS
  775.   SHARED VB
  776.   CLS
  777.   LOCATE 3,14:PRINT"The following internal dimensions will produce"
  778.   LOCATE 4,14:PRINT"an enclosure based on golden rectangle proportions,"
  779.   LOCATE 5,14:PRINT"minimizing resonance problems, and having a pleasing"
  780.   LOCATE 6,14:PRINT"appearance. (volume is the current working volume"
  781.   LOCATE 7,14:PRINT"plus ten percent for braces and internal parts.)"
  782.   LOCATE 9,14:PRINT"Note: parallel wall enclosures do not typically"
  783.   LOCATE 10,14:PRINT"achieve maximum performance- use with caution!"
  784.   VBTEN=VB*1.1
  785.   LOCATE 12,22:PRINT USING"Enclosure volume= ###.## cubic feet";VBTEN
  786.   CID=VB*1728*1.1
  787.   WIDE=CID^(1/3)
  788.   DEPTH=WIDE*.618
  789.   HEIGHT=WIDE*1.618
  790.   LOCATE 14,29:PRINT USING"Height =###.## inches";HEIGHT
  791.   LOCATE 15,29:PRINT USING"Width  =###.## inches";WIDE
  792.   LOCATE 16,29:PRINT USING"Depth  =###.## inches";DEPTH
  793.   LOCATE 20,24:PRINT"Hit any key to return to menu #2"
  794.   CALL WAITFOKEY
  795. END SUB
  796.  
  797. SUB VENTLENGTH               'VENT LENGTH CALCULATION ROUTINE
  798.   SHARED QUERY$, MINALLOWVAL!, MAXALLOWVAL!, OLDVAL!, NEWVAL!,_
  799.                  VENTDIA, FB, VB, K$
  800.   DO
  801.     CLS
  802.     LOCATE 3,20:PRINT"VENT LENGTH CALCULATOR FOR ROUND TUBING"
  803.     PRINT:PRINT:PRINT
  804.  
  805.     QUERY$="Enter tubing ID in inches"
  806.     MINALLOWVAL!=.5
  807.     MAXALLOWVAL!=12
  808.     OLDVAL!=VENTDIA
  809.     GOSUB STANDARDDATAIN
  810.     VENTDIA=NEWVAL!
  811.  
  812.     QUERY$="Enter tuning frequency in Hertz"
  813.     MINALLOWVAL!=1
  814.     MAXALLOWVAL!=999
  815.     OLDVAL!=FB
  816.     GOSUB STANDARDDATAIN
  817.     TEMPFB=NEWVAL!
  818.  
  819.     QUERY$="Enter enclosure volume"
  820.     MINALLOWVAL!=.01
  821.     MAXALLOWVAL!=999
  822.     OLDVAL!=VB
  823.     GOSUB STANDARDDATAIN
  824.     TEMPVB=NEWVAL!
  825.  
  826.     TEMPVB=TEMPVB*1728
  827.     VENTRAD=VENTDIA/2
  828.     VENTL=((1.463*1E+07*VENTRAD^2)/(TEMPFB^2*TEMPVB))-1.463*VENTRAD
  829.     LOCATE 16,25:PRINT USING"The vent length = ##.## inches";VENTL
  830.  
  831.     IF VENTL<0 THEN
  832.       LOCATE 18,11:PRINT"WARNING: Negative vent lengths are difficult to ";
  833.       PRINT"fabricate!"
  834.     END IF
  835.  
  836.     LOCATE 20,20:PRINT"Hit 'R' to repeat, any other for menu #2"
  837.     CALL WAITFOKEY
  838.     IF K$="R" OR K$="r" THEN REPEATFLAG%=1 ELSE REPEATFLAG%=0
  839.   LOOP UNTIL REPEATFLAG%=0
  840. END SUB
  841.  
  842. DAMAGEINIT:                  'SPECIAL ERROR HANDLER FOR SETUP FILE
  843. RESUME NEXT
  844.  
  845. DAMAGECONTROL:               'STANDARD ERROR HANDLER
  846.  
  847.   FOR N%=150 TO 40 STEP -1   'MAKE A MILDLY OFFENSIVE SOUND
  848.     SOUND N%,.02
  849.   NEXT N%
  850.   SOUND 40,5
  851.  
  852.   PRINT"AN ERROR HAS OCCURRED- THE ERROR CODE=";ERR
  853.   IF ERR=6 THEN PRINT"OVERFLOW ERROR!"
  854.   IF ERR=11 THEN PRINT"DIVISION BY ZERO ERROR!"
  855.   IF ERR=27 THEN PRINT"PLEASE CHECK PRINTER!"
  856.   IF ERR=25 THEN PRINT"DEVICE FAULT- CHECK PRINTER!"
  857.   IF ERR=53 THEN PRINT"DATA FILE(S) NOT FOUND"
  858.   IF ERR=61 THEN PRINT"DISK IS FULL!"
  859.   IF ERR=67 THEN PRINT"TOO MANY FILES!"
  860.   IF ERR=71 THEN PRINT"DRIVE NOT READY- CHECK DRIVE!"
  861.   IF ERR=72 THEN PRINT"DISK MEDIA ERROR- CHECK MEDIA!"
  862.   DELAY 2
  863. RESUME NEXT
  864.  
  865. SUB FOOLISHNESS              'FUTURE ROUTINE MESSAGE
  866.   CLS
  867.   LOCATE 12,20:PRINT"This area reserved for future additions."
  868.   PRINT
  869.   IF RND(1) > 0.5 THEN
  870.     LOCATE 14,14:PRINT"You think education is expensive.... try ignorance!"
  871.   ELSEIF RND(0) > 0.25 THEN
  872.     LOCATE 14,15:PRINT"On the other hand, we know some EEs who can't get"
  873.     LOCATE 15,15:PRINT"the polarity right when screwing in a light bulb!"
  874.   ELSE
  875.     LOCATE 14,16:PRINT"The VGA opening screen reminded you of what!!!"
  876.   END IF
  877.   DELAY 4
  878. END SUB
  879.  
  880. SUB VOLCONVERT     'CONVERSION FROM LITERS TO CUBIC FEET AND BACK AGAIN
  881.   DO
  882.     CLS
  883.     LOCATE 3,24:PRINT"LITER <==> CUBIC FOOT CONVERSION"
  884.     LOCATE 8,15:PRINT"Enter the volume, followed by L or F to indicate"
  885.     LOCATE 9,15:PRINT"liters or cubic feet (such as 99.9L).  The answer"
  886.     LOCATE 10,15:PRINT"will be returned in the opposite units."
  887.     LOCATE 12,15
  888.     INPUT VOL$
  889.  
  890.     CUBICF!=VAL(VOL$)*.03531466!
  891.     LITER!=VAL(VOL$)*28.31684659!
  892.  
  893.     ERRORFLAG%=1
  894.  
  895.     IF RIGHT$(VOL$,1)="L" OR RIGHT$(VOL$,1)="l" THEN
  896.       LOCATE 15,22:PRINT ROUND(VAL(VOL$),4);"liters =";
  897.       PRINT ROUND(CUBICF!,4);"cubic feet"
  898.       ERRORFLAG%=0
  899.     END IF
  900.  
  901.     IF RIGHT$(VOL$,1)="F" OR RIGHT$(VOL$,1)="f" THEN
  902.       LOCATE 15,22:PRINT ROUND(VAL(VOL$),4);"cubic feet =";
  903.       PRINT ROUND(LITER!,4);"liters"
  904.       ERRORFLAG%=0
  905.     END IF
  906.  
  907.     IF ERRORFLAG%=1 THEN
  908.       SOUND 50,5                       'MAKE A LOW PITCHED BEEP
  909.       LOCATE 16,22:PRINT"INCORRECT FORMAT- USE L OR F SUFFIX!"
  910.     END IF
  911.  
  912.     LOCATE 22,33:PRINT"Hit any key"
  913.     CALL WAITFOKEY
  914.   LOOP WHILE ERRORFLAG%=1
  915. END SUB
  916.  
  917. SUB UNIVPRINT SHARED         ' UNIVERSAL PRINTOUT ROUTINE
  918.   LPRINT:LPRINT
  919.   LPRINT "Driver name: ";D$
  920.   LPRINT "Design type: ";DESIGN$
  921.   LPRINT "Parameters-"
  922.   LPRINT USING "  Free air resonance: ###.## hertz";FS
  923.   LPRINT USING "  Qts               :   #.####";QTS
  924.   LPRINT USING "  Vas               :  ##.####";VAS
  925.   LPRINT
  926.   LPRINT USING "Enclosure volume    :  ##.## cubic feet";VB
  927.  
  928.   IF DESIGN$="optimal ported" THEN
  929.     LPRINT USING "Enclosure tuning    :  ##.## hertz";FB
  930.     LPRINT USING "Three dB down at    : ###.## hertz";FH
  931.   END IF
  932.  
  933.   IF DESIGN$="sealed" THEN
  934.     LPRINT USING "Three dB down at    : ###.## hertz";F3
  935.     LPRINT USING "Qtc                 :   #.####";TC
  936.     LPRINT USING "Alpha               :  ##.####";A
  937.     LPRINT USING "System resonance    : ###.#### hertz";FC
  938.   END IF
  939.  
  940.   IF DESIGN$="non-optimal, ported" THEN
  941.     LPRINT USING "Enclosure tuning    : ###.## hertz";FB
  942.   END IF
  943.  
  944. END SUB
  945.  
  946. SUB SETUPDATAOUT SHARED      'SCREEN AND COLOR SELECTION ROUTINE
  947.   DO
  948.     REPEATFLAG%=0
  949.     ODPATH$=DPATH$
  950.     IF AUTOFLAG%=1 THEN OVIDEOTYPE$="AUTO" ELSE OVIDEOTYPE$=VIDEOTYPE$
  951.     SCREEN 0,0,0
  952.     CLS
  953.     LOCATE 3,20:PRINT"DISPLAY TYPE, COLOR, AND PATH SELECTION"
  954.     LOCATE 6,2:PRINT"Select HERC, CGA, EGA, VGA, or AUTO";
  955.     PRINT" (default is ";OVIDEOTYPE$;")";
  956.     LOCATE ,60
  957.     INPUT VIDEOTYPE$
  958.     IF VIDEOTYPE$="" THEN VIDEOTYPE$=OVIDEOTYPE$
  959.     IF VIDEOTYPE$<>"HERC" AND VIDEOTYPE$<>"CGA" AND VIDEOTYPE$<>"EGA" AND_
  960.        VIDEOTYPE$<>"VGA" AND VIDEOTYPE$<>"AUTO" THEN BEEP:REPEATFLAG%=1
  961.   LOOP UNTIL REPEATFLAG%=0
  962.  
  963.   IF VIDEOTYPE$="AUTO" THEN
  964.     AUTOFLAG%=1
  965.     CALL LOOKFOVID
  966.   ELSE
  967.     AUTOFLAG%=0
  968.   END IF
  969.  
  970.   PRINT
  971.  
  972.   QUERY$="Select text color 0-15"
  973.   MINALLOWVAL% = 0
  974.   MAXALLOWVAL% = 15
  975.   OLDVAL% = KOLORA%
  976.   GOSUB STANDARDINTIN
  977.   KOLORA% = NEWVAL%
  978.  
  979.   QUERY$="Select background color 0-7"
  980.   MINALLOWVAL% = 0
  981.   MAXALLOWVAL% = 7
  982.   OLDVAL% = KOLORB%
  983.   GOSUB STANDARDINTIN
  984.   KOLORB% = NEWVAL%
  985.  
  986.   PRINT" Enter the drive and path for driver file storage in exactly"
  987.   PRINT" this form=>    C:\NAME1\NAME2\...\NAMEX\"
  988.   PRINT" The default is ";DPATH$
  989.   LOCATE ,15
  990.   INPUT DPATH$
  991.   IF DPATH$="" THEN DPATH$=ODPATH$
  992.   PRINT
  993.  
  994.   IF VIDEOTYPE$<>"HERC" THEN
  995.     QUERY$="Enter graph color 1-15"
  996.     MINALLOWVAL% = 1
  997.     MAXALLOWVAL% = 15
  998.     OLDVAL% = GRAPHKOLORA%
  999.     GOSUB STANDARDINTIN
  1000.     GRAPHKOLORA% = NEWVAL%
  1001.  
  1002.     QUERY$="Enter graph background 0-15"
  1003.     MINALLOWVAL% = 0
  1004.     MAXALLOWVAL% = 15
  1005.     OLDVAL% = GRAPHKOLORB%
  1006.     GOSUB STANDARDINTIN
  1007.     GRAPHKOLORB% = NEWVAL%
  1008.  
  1009.     IF (VIDEOTYPE$="EGA") OR (VIDEOTYPE$="VGA") THEN
  1010.       QUERY$="Enter plot color 0-15"
  1011.       MINALLOWVAL% = 0
  1012.       MAXALLOWVAL% = 15
  1013.       OLDVAL% = GRAPHKOLORC%
  1014.       GOSUB STANDARDINTIN
  1015.       GRAPHKOLORC% = NEWVAL%
  1016.     END IF
  1017.  
  1018.   END IF
  1019.  
  1020.   QUERY$="Enter plot resolution: 1-20 hz"
  1021.   MINALLOWVAL% = 1
  1022.   MAXALLOWVAL% = 20
  1023.   OLDVAL% = RESOL%
  1024.   GOSUB STANDARDINTIN
  1025.   RESOL% = NEWVAL%
  1026.  
  1027.   SCREEN 0
  1028.   IF RIGHT$(VIDEOTYPE$,2)="GA" THEN COLOR KOLORA%,KOLORB%
  1029.   CLS
  1030.   LOCATE 5,18:PRINT"This is what the text display will look like"
  1031.   LOCATE 7,18:PRINT"The path is=> ";DPATH$
  1032.   LOCATE 9,18:PRINT"Hit a key to see the graph, then a key to return"
  1033.   CALL WAITFOKEY
  1034.   GOSUB PRINTGRAPH
  1035.   SCREEN 0
  1036.   IF RIGHT$(VIDEOTYPE$,2)="GA" THEN COLOR KOLORA%,KOLORB%
  1037.   CLS
  1038.   LOCATE 5,10:PRINT"Hit y to save setup, any other for menu #2"
  1039.   CALL WAITFOKEY
  1040.   IF K$="Y" OR K$="y" THEN
  1041.     IF AUTOFLAG%=1 THEN VIDEOTYPE$="AUTO"
  1042.       OPEN "LOUDSP.SCR" FOR OUTPUT AS #1
  1043.       WRITE#1,VIDEOTYPE$
  1044.       WRITE#1,KOLORA%
  1045.       WRITE#1,KOLORB%
  1046.       WRITE#1,GRAPHKOLORA%
  1047.       WRITE#1,GRAPHKOLORB%
  1048.       WRITE#1,GRAPHKOLORC%
  1049.       WRITE#1,RESOL%
  1050.       WRITE#1,DPATH$
  1051.     CLOSE
  1052.     IF AUTOFLAG%=1 THEN CALL LOOKFOVID
  1053.   END IF
  1054. END SUB
  1055.  
  1056. SUB SETUPDATAIN              'READ THE SETUP DATA FILE- LOUDSP.SCR
  1057.   SHARED VIDEOTYPE$, KOLORA%, KOLORB%, KOLORC%,_
  1058.          GRAPHKOLORA%, GRAPHKOLORB%, GRAPHKOLORC%, RESOL%, DPATH$
  1059.   ON ERROR GOTO DAMAGEINIT
  1060.   OPEN "LOUDSP.SCR" FOR INPUT AS #1
  1061.   INPUT #1, VIDEOTYPE$, KOLORA%, KOLORB%, GRAPHKOLORA%,_
  1062.             GRAPHKOLORB%, GRAPHKOLORC%, RESOL%, DPATH$
  1063.   CLOSE
  1064.   ON ERROR GOTO DAMAGECONTROL
  1065. END SUB
  1066.  
  1067. SUB SETUPCHECK               'CHECK FOR COLOR CONFLICTS OR NO FILE
  1068.   SHARED KOLORA%, KOLORB%, KOLORC%, GRAPHKOLORA%, GRAPHKOLORB%,_
  1069.          GRAPHKOLORC%, VIDEOTYPE$
  1070.   IF KOLORA%=KOLORB% OR GRAPHKOLORA%=GRAPHKOLORB% THEN
  1071.     SCREEN 0,0,0
  1072.     CLS
  1073.     PRINT
  1074.     PRINT
  1075.     PRINT
  1076.     PRINT
  1077.     PRINT "     Hey dude!  I can't find the setup file, but no problemo, OK?"
  1078.     PRINT "     Please select the setup option in menu #2 when you get a"
  1079.     PRINT "     chance.  If you'll give me a couple seconds, I'll set the"
  1080.     PRINT "     video mode to CGA, and the colors to somthing useable..."
  1081.     PRINT "     If you need Hercules, see the doc file that goes with the"
  1082.     PRINT "     program!"
  1083.     VIDEOTYPE$="CGA":KOLORA%=14:KOLORB%=1:KOLORC%=0
  1084.     GRAPHKOLORA%=14:GRAPHKOLORB%=1:GRAPHKOLORC%=15
  1085.     DELAY 15
  1086.   END IF
  1087. END SUB
  1088.  
  1089. SUB DOSSHELL                 'SHELL TO DOS ROUTINE
  1090.   SHELL
  1091. END SUB
  1092.  
  1093. SUB MAXPOWER SHARED          'MAXPOWER
  1094.  
  1095.  
  1096.   CLS
  1097.   LOCATE 3,10:PRINT"MAXIMUM POWER & SPL RELATIONSHIPS"
  1098.   LOCATE 7,10:PRINT"Power values will be based on the current active"
  1099.   LOCATE 8,10:PRINT"design, ie: the last design entered into the program."
  1100.   LOCATE 9,10:PRINT"If you have yet to calculate a design, please hit"
  1101.   LOCATE 10,10:PRINT"'R' to return to the main menu.  hit any other key"
  1102.   LOCATE 11,10:PRINT"to continue with this selection."
  1103.   CALL WAITFOKEY
  1104.   IF K$="R" OR K$="r" THEN RETURN
  1105.  
  1106.   CLS
  1107.   PRINT:PRINT:PRINT
  1108.  
  1109.   QUERY$="Enter actual moving diameter in inches"
  1110.   MINALLOWVAL! = 1
  1111.   MAXALLOWVAL! = 999
  1112.   OLDVAL! = ACDI
  1113.   GOSUB STANDARDDATAIN
  1114.   ACDI = NEWVAL!
  1115.  
  1116.   QUERY$="Enter p-p driver excursion in inches"
  1117.   MINALLOWVAL! = .01
  1118.   MAXALLOWVAL! = 6
  1119.   OLDVAL! = EXCI
  1120.   GOSUB STANDARDDATAIN
  1121.   EXCI = NEWVAL!
  1122.  
  1123.   QUERY$="Enter maximum input in Watts RMS"
  1124.   MINALLOWVAL! = .01
  1125.   MAXALLOWVAL! = 999
  1126.   OLDVAL! = WRMS
  1127.   GOSUB STANDARDDATAIN
  1128.   WRMS = NEWVAL!
  1129.  
  1130.   QUERY$="Enter DC resistance in ohms"
  1131.   MINALLOWVAL! = .01
  1132.   MAXALLOWVAL! = 999
  1133.   OLDVAL! = RE
  1134.   GOSUB STANDARDDATAIN
  1135.   RE = NEWVAL!
  1136.  
  1137.   QUERY$="Enter electrical Q [Qes]"
  1138.   MINALLOWVAL! = .01
  1139.   MAXALLOWVAL! = 999
  1140.   OLDVAL! = QES
  1141.   GOSUB STANDARDDATAIN
  1142.   QES = NEWVAL!
  1143.  
  1144.   VRMS=SQR(WRMS*RE)
  1145.   KP=SQR(VAS*FS^3/QES/RE)/753
  1146.   KD=.3535*SQR(VAS/FS/QES/RE)/ACDI^2
  1147.  
  1148.   IF DESIGN$="optimal ported" OR DESIGN$="non-optimal, ported" THEN
  1149.     H=FB/FS
  1150.     A=VAS/VB
  1151.     Q7=7
  1152.   ELSE
  1153.     H=.0001
  1154.     Q7=10000
  1155.   END IF
  1156.  
  1157.   H2=SQR(H)
  1158.   A1=H2/Q7+1/QTS/H2
  1159.   A2=1/QTS/Q7+(A+1+H^2)/H
  1160.   A3=H2/QTS+1/Q7/H2
  1161.   F1=H2*FS
  1162.  
  1163.   CLS                        'START OF SCREEN OUTPUT ROUTINE
  1164.   LOCATE 2,5:PRINT"FREQ"
  1165.   LOCATE 2,25:PRINT"RESPONSE (dB)"
  1166.   LOCATE 2,45:PRINT"MAX PWR.(RMS)"
  1167.   LOCATE 2,65:PRINT"SPL (dB)"
  1168.   PRINT
  1169.   FOR F%=20 TO 200 STEP 10
  1170.     X=F%/F1
  1171.     Y=X^4/SQR((X^4-A2*X^2+1)^2+(A1*X^3-A3*X)^2)
  1172.     Y1=Y*SQR((X^2/H-1)^2+(X/Q7)^2/H)/X^4
  1173.     E1=EXCI/KD/Y1/39.37
  1174.     IF E1<VRMS THEN E2=E1
  1175.     IF VRMS<=E1 THEN E2=VRMS
  1176.     RESPONSE=20*LOG(Y)/LOG(10)
  1177.     SPL=20*LOG(KP*Y*E2*50000!)/LOG(10)
  1178.     POWER=E2^2/RE
  1179.     PRINT USING"    ###                    ###.##";F%,RESPONSE;
  1180.     PRINT USING"              ###.#             ###.##";POWER,SPL
  1181.   NEXT F%
  1182.   LOCATE 24,23:PRINT"HIT ANY KEY TO RETURN TO MAIN MENU";
  1183.   CALL WAITFOKEY
  1184. END SUB
  1185.  
  1186. SUB CROSSOVER SHARED         'CROSSOVER DESIGN ROUTINES (L-R ALLPASS TYPE)
  1187.   CLS
  1188.   LOCATE 3,17:PRINT"SECOND ORDER ALL PASS CROSSOVER (APC) DESIGNER"
  1189.   LOCATE 10
  1190.  
  1191.   QUERY$="Two (2) or three (3) way design"
  1192.   MINALLOWVAL! = 2
  1193.   MAXALLOWVAL! = 3
  1194.   OLDVAL! = WAY
  1195.   GOSUB STANDARDDATAIN
  1196.   WAY = NEWVAL!
  1197.  
  1198.   QUERY$="Enter woofer impedance in ohms"
  1199.   MINALLOWVAL! = .01
  1200.   MAXALLOWVAL! = 999
  1201.   OLDVAL!=RL
  1202.   GOSUB STANDARDDATAIN
  1203.   RL = NEWVAL!
  1204.  
  1205.   QUERY$="Enter tweeter impedance in ohms"
  1206.   MINALLOWVAL! = .01
  1207.   MAXALLOWVAL! = 999
  1208.   OLDVAL! = RH
  1209.   GOSUB STANDARDDATAIN
  1210.   RH = NEWVAL!
  1211.  
  1212.   IF WAY=3 THEN
  1213.     QUERY$="Enter midrange impedance in ohms"
  1214.     MINALLOWVAL! = .01
  1215.     MAXALLOWVAL! = 999
  1216.     OLDVAL! = RM
  1217.     GOSUB STANDARDDATAIN
  1218.     RM = NEWVAL!
  1219.   END IF
  1220.  
  1221.   QUERY$="Enter woofer crossover frequency"
  1222.   MINALLOWVAL! = 5
  1223.   MAXALLOWVAL! = 20000
  1224.   OLDVAL! = FL
  1225.   GOSUB STANDARDDATAIN
  1226.   FL = NEWVAL!
  1227.  
  1228.   IF WAY=3 THEN
  1229.     QUERY$="Enter tweeter crossover frequency"
  1230.     MINALLOWVAL! = 5
  1231.     MAXALLOWVAL! = 20000
  1232.     OLDVAL! = FH
  1233.     GOSUB STANDARDDATAIN
  1234.     FH = NEWVAL!
  1235.   END IF
  1236.  
  1237.   IF WAY=2 THEN
  1238.     CALL TWOWAYCALC
  1239.   ELSE
  1240.  
  1241.     FM=SQR(FL*FH)
  1242.     W1=2*PI*FL
  1243.     W2=2*PI*FM
  1244.     W3=2*PI*FH
  1245.     S=FH/FL
  1246.     R=SQR(S)
  1247.     A=(2*(S-1))/SQR((S*S)-(2*S))
  1248.     H=S+(A*A)-4+(3/S)
  1249.     AA=A*(R+(1/R))
  1250.     B=S+(A*A)+(1/S)
  1251.     C1=1/A/RL/W1
  1252.     L1=A*RL/W1
  1253.     L2=A*RH/W3
  1254.     C2=1/A/RH/W3
  1255.     K=B-1
  1256.     E=AA*(1-1/K)
  1257.     RA=RM*(K/H-1)
  1258.     R0=RM
  1259.     C3=1/AA/R0/W2
  1260.     L3=AA*R0/W2/K
  1261.     L4=E*R0/W2
  1262.     C4=K/E/R0/W2
  1263.     CALL SCHEMATIC
  1264.     LOCATE 13,17:PRINT USING"For the tweeter Z1=###.## uF and ";C2*1E6;
  1265.     PRINT USING"Z2=###.## mH";L2*1000
  1266.     LOCATE 15,17:PRINT"For the midrange two stages are required:"
  1267.     LOCATE 16,17:PRINT USING"Stage 1  Z1=###.## uF and ";C4*1E6;
  1268.     PRINT USING"Z2=###.## mH";L4*1000
  1269.     LOCATE 17,17:PRINT USING"Stage 2  Z1=###.## mH and ";L3*1000;
  1270.     PRINT USING"Z2=###.## uF";C3*1E6
  1271.     LOCATE 19,17:PRINT USING"For the woofer Z1=###.## mH and ";L1*1000;
  1272.     PRINT USING"Z2=###.## uF";C1*1E6
  1273.     LOCATE 22,17:PRINT"Be sure to reverse the polarity of the midrange!"
  1274.     CALL WAITFOKEY
  1275.   END IF
  1276. END SUB
  1277.  
  1278.  
  1279. SUB SCHEMATIC                ' SCHEMATIC DIAGRAM ROUTINE
  1280.   CLS
  1281.   PRINT
  1282.   PRINT"                         ┌─────────┐                                    "
  1283.   PRINT"      ───────────────────┤   Z 1   ├──────────────┬──────────────────>  "
  1284.   PRINT"        +                └─────────┘              │                +    "
  1285.   PRINT"                                             ┌────┴────┐                "
  1286.   PRINT"           INPUT                             │   Z 2   │      TO DRIVER "
  1287.   PRINT"                                             └────┬────┘    OR NEXT STAGE"
  1288.   PRINT"                                                  │                     "
  1289.   PRINT"        -                                         │                -    "
  1290.   PRINT"      ────────────────────────────────────────────┴──────────────────>  "
  1291. END SUB
  1292.  
  1293. SUB TWOWAYCALC SHARED        ' TWO WAY DESIGN CALCULATION ROUTINE
  1294.  
  1295.   W1=2*PI*FL
  1296.   C1=1/(2*RL*W1)
  1297.   L1=2*RL/W1
  1298.   L2=2*RH/W1
  1299.   C2=1/(2*RH*W1)
  1300.  
  1301.   CALL SCHEMATIC
  1302.   LOCATE 13,17:PRINT USING"For the tweeter Z1=###.## uF and ";C2*1E6;
  1303.   PRINT USING"Z2=###.## mH";L2*1000
  1304.   LOCATE 15,17:PRINT USING"For the woofer Z1=###.## mH and ";L1*1000;
  1305.   PRINT USING"Z2=###.## uF";C1*1E6
  1306.   LOCATE 17,17:PRINT"Be sure to reverse the polarity of the tweeter!"
  1307.   LOCATE 22,34:PRINT"Hit any key"
  1308.   CALL WAITFOKEY
  1309. END SUB
  1310.  
  1311. SUB LOOKFOVID                'PROBE THE HARDWARE TO DETERMINE VIDEO ADAPTOR
  1312.   SHARED BUFFER%(), VIDEOTYPE$
  1313.  
  1314.   REG 1, &h1B00              'SET AX REGISTER TO BIOS SERVICE 1Bh
  1315.   REG 7, VARPTR(BUFFER%(0))  'SET BP REGISTER TO BUFFER OFFSET ADDRESS
  1316.   REG 9, VARSEG(BUFFER%(0))  'SET ES REGISTER TO BUFFER SEGMENT ADDRESS
  1317.   CALL INTERRUPT &h10        'CALL VIDEO INTERRUPT
  1318.  
  1319.   IF (REG(1) AND &h1B) = &h1B THEN     'CHECK AL FOR 1Bh SHOWING VGA
  1320.     VIDEOTYPE$="VGA"
  1321.   ELSE
  1322.     CALL INTERRUPT &h11
  1323.     CARD = (REG(1) AND &h30)           'GET THE INITIAL VIDEO MODE BITS
  1324.     IF CARD = &h00 THEN CARD = 0
  1325.     IF CARD = &h10 THEN CARD = 1
  1326.     IF CARD = &h20 THEN CARD = 2
  1327.     IF CARD = &h30 THEN CARD = 3
  1328.  
  1329.     REG 1, &h0F00
  1330.     CALL INTERRUPT &h10
  1331.     VMODE=REG(1)
  1332.     VMODE=VMODE AND &hFF               'GET THE CURRENT VIDEO MODE
  1333.  
  1334.     VIDEOTYPE$="UNKNOWN"
  1335.     DEF SEG = &h40
  1336.     IF PEEK(135) THEN                  'NON-ZERO AT 487h INDICATES EGA
  1337.       VIDEOTYPE$="EGA"
  1338.     ELSE
  1339.       IF (CARD=3) THEN
  1340.  
  1341.         N=0
  1342.         DO
  1343.           IF (INP(&h3BA) AND 128) THEN VIDEOTYPE$="HERC":EXIT LOOP
  1344.           N=N+1
  1345.         LOOP WHILE N<1000
  1346.  
  1347.         IF VIDEOTYPE$="UNKNOWN" THEN VIDEOTYPE$="MDA"
  1348.       ELSE
  1349.         IF (CARD=2) OR (CARD=0) THEN
  1350.           IF (VMODE=2) THEN
  1351.             VIDEOTYPE$="COMPAQ"
  1352.           ELSE
  1353.             VIDEOTYPE$="CGA"
  1354.           END IF
  1355.         END IF
  1356.       END IF
  1357.     END IF
  1358.   END IF
  1359.  
  1360.   DEF SEG
  1361.  
  1362.   IF VIDEOTYPE$="COMPAQ" OR VIDEOTYPE$="UNKNOWN" OR VIDEOTYPE$="MDA" THEN
  1363.     BEEP
  1364.     PRINT"CAUTION: Video type not identified, please set set manually..."
  1365.     PRINT"         See program documentation!"
  1366.     DELAY 3
  1367.     VIDEOTYPE$="CGA"
  1368.   END IF
  1369. END SUB
  1370.  
  1371. SUB FIRSTSCREEN1             'DRAW SPEAKER W/ CONE PULLED IN ON PAGE #0
  1372.   SHARED VIDEOTYPE$
  1373.   WINDOW SCREEN (0,750)-(1000,0)       'NORMALIZE SCREEN TO 1000 x 750
  1374.   CLS
  1375.   LINE (15,15)-(985,735),,B            'DRAW THE OUTER BOX
  1376.   LINE (25,25)-(975,725),,B            'DRAW THE INNER BOX
  1377.  
  1378.   CIRCLE (365,180),30,,4.547,7.689     'UPPER ROLL
  1379.   CIRCLE (365,570),30,,4.877,8.019     'LOWER ROLL
  1380.   LINE (240,330)-(360,210)             'UPPER HALF OF CONE
  1381.   LINE (240,420)-(360,540)             'LOWER HALF OF CONE
  1382.   CIRCLE (190,375),65,,5.58,7.02       'DUSTCAP
  1383.   LINE (150,330)-(240,330)             'UPPER VC
  1384.   LINE (150,420)-(240,420)             'LOWER VC
  1385.   CIRCLE (857,375),35,,1.867,4.416     'TWEETER DOME
  1386.   CALL STATIONARYIMAGE
  1387. END SUB
  1388.  
  1389. SUB FIRSTSCREEN2             'DRAW SPEAKER W/ CONE PUSHED OUT ON PAGE #1
  1390.   SHARED KOLORA%, KOLORB%
  1391.   SCREEN ,,1,0
  1392.   COLOR KOLORA%, KOLORB%
  1393.   CLS
  1394.   LINE (15,15)-(985,735),,B            'DRAW THE OUTER BOX
  1395.   LINE (25,25)-(975,725),,B            'DRAW THE INNER BOX
  1396.   CIRCLE (375,180),30,,4.877,8.019     'UPPER ROLL
  1397.   CIRCLE (375,570),30,,4.547,7.689     'LOWER ROLL
  1398.   LINE (260,330)-(380,210)             'UPPER HALF OF CONE
  1399.   LINE (260,420)-(380,540)             'LOWER HALF OF CONE
  1400.   CIRCLE (210,375),65,,5.58,7.02       'DUSTCAP
  1401.   LINE (170,330)-(260,330)             'UPPER VC
  1402.   LINE (170,420)-(260,420)             'LOWER VC
  1403.   CIRCLE (855,375),35,,1.745,4.538     'TWEETER DOME
  1404.   CALL STATIONARYIMAGE
  1405. END SUB
  1406.  
  1407. SUB ROTATE                   'ALTERNATE SCREENS TO SIMULATE MOTION
  1408.   T=0.2
  1409.   K$=""
  1410.   DO
  1411.     screen ,,,1              'FLIP TO SCREEN PAGE #1
  1412.     delay T                  'GIVE IT TIME TO SINK IN
  1413.     screen ,,,0              'FLIP TO SCREEN PAGE #2
  1414.     delay T                  'GIVE IT TIME TO SINK IN
  1415.     K$=INKEY$                'SEE IF THEY GOT BORED AND PRESSED A KEY
  1416.     IF K$="F" THEN T=T-.02
  1417.     IF K$="S" THEN T=T+.02
  1418.     IF T<0 THEN T=0:BEEP
  1419.     IF K$=" " THEN EXIT LOOP
  1420.   LOOP                       'DO IT ALL AGAIN
  1421. END SUB
  1422.  
  1423. SUB TITLETEXT
  1424.   SHARED VERSION$
  1425.   LOCATE 11,30:PRINT"LOUDSPEAKER DESIGN"
  1426.   LOCATE 13,30:PRINT"FOR THE IBM COMPATIBLE COMPUTER"
  1427.   LOCATE 15,30:PRINT VERSION$
  1428. END SUB
  1429.  
  1430. SUB STATIONARYIMAGE                    'NON MOVING STUFF FOR BOTH SCREENS
  1431.   LINE (130,300)-(130,450)             'LEFT SIDE OF MAGNET
  1432.   LINE (125,320)-(130,320)             'TOP OF REAR DETAIL
  1433.   LINE (125,430)-(130,430)             'BOTTOM OF  REAR DETAIL
  1434.   LINE (125,320)-(125,430)             'LEFT SIDE OF REAR DETAIL
  1435.   LINE (130,300)-(200,300)             'TOP OF MAGNET
  1436.   LINE (130,450)-(200,450)             'BOTTOM OF MAGNET
  1437.   LINE (200,300)-(200,320)             'UPPER RIGHT OF MAGNET
  1438.   LINE (200,450)-(200,430)             'LOWER LEFT OF MAGNET
  1439.   LINE (140,320)-(200,320)             'TOP OF PLUG
  1440.   LINE (140,430)-(200,430)             'MORE INTERNAL DETAILS
  1441.   LINE (140,320)-(140,340)
  1442.   LINE (140,430)-(140,410)
  1443.   LINE (140,340)-(200,340)
  1444.   LINE (140,410)-(200,410)
  1445.   LINE (200,340)-(200,410)             'END OF MAGNET PLUG
  1446.   LINE (200,315)-(370,150)             'INSIDE TOP OF BASKET
  1447.   LINE (200,435)-(370,600)             'INSIDE BOTTOM OF BASKET
  1448.   LINE (370,110)-(370,150)             'TOP TAB
  1449.   LINE (365,110)-(365,150)             'LEFT SIDE OF TAB
  1450.   LINE (370,110)-(365,110)             'UPPER MOST EDGE
  1451.   LINE (370,640)-(370,600)             'BOTTOM TAB
  1452.   LINE (365,640)-(365,600)             'LEFT SIDE OF TAB
  1453.   LINE (365,640)-(370,640)             'BOTTOM MOST EDGE
  1454.   LINE (850,200)-(860,550),,B          'TWEETER PLATE
  1455.   LINE (860,250)-(910,500),,B          'TWEETER MAGNET
  1456.   CALL TITLETEXT
  1457. END SUB
  1458. '>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END OF LISTING <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  1459.